package com.rfid.rfidbluetooth;

import java.io.IOException;
import java.io.InputStream;
import java.util.LinkedList;

public class InWriteableStream extends InputStream {
    private LinkedList buffer = new LinkedList(); // 使用队列作为缓冲区
    private int capacity; // 缓冲区容量
    private int count = 0; // 当前缓冲区中已写入的数据量  
    private final Object lock = new Object(); // 用于同步的锁对象  

    public InWriteableStream() {
        this.capacity = 20*1024;
    }

    public void writeBytes(byte[] bytes) throws IOException {
        System.out.println("writeBytes size = " + bytes.length);
        synchronized (lock) {
            while (buffer.size() + bytes.length >= capacity && buffer.size() > 0) { // 等待直到有空间写入
                try {
                    System.out.println("lock");
                    lock.wait(); // 等待消费者消费数据，释放空间
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt(); // 重新中断当前线程，以便上层处理
                    throw new IOException("Interrupted while waiting to write bytes", e);
                }
            }
            for (byte b : bytes) {
                buffer.add(b);
            }
            count += bytes.length; // 更新已写入的数据量
            lock.notifyAll(); // 通知消费者数据已写入，有数据可消费
        }
    }

    @Override
    public int read() throws IOException {
        synchronized (lock) {
            while (buffer.size() == 0) { // 等待直到有数据写入
                try {
                    lock.wait(); // 等待生产者生产数据，填充数据到缓冲区中
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt(); // 重新中断当前线程，以便上层处理
                    throw new IOException("Interrupted while waiting to read bytes", e);
                }
            }
            byte data = (byte) buffer.remove(); // 从缓冲区中获取数据并移除
            lock.notifyAll(); // 通知生产者数据已读取完毕，可以继续生产数据了
            return data&0xff; // 返回读取到的字节数组
        }
    }

    @Override
    public void close() throws IOException {
        super.close();
        buffer.clear();
        lock.notifyAll();
    }
}